
package com.x52im.rbchat.logic.chat_friend.vv;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.vc.core.P2PController;
import com.vc.core.VcController;
import com.x52im.rbchat.MyApplication;

import net.x52im.rainbowav.sdk.AccountManager;
import net.x52im.rainbowav.sdk.iface.ILoginEventListener;
import net.x52im.rainbowav.sdk.util.DeviceUtil;
import net.x52im.rainbowav.sdk.util.NetworkUtil;

// VideoVoiceP2PProvider
/**
 * 新音视频聊天框架提供者实现类.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 * @see com.vc.core.P2PController
 * @see com.vc.core.VcController
 * @see com.vc.core.VcConstants
 */
public class VVP2PProvider
{
	private final static String TAG = "[V$V$P2P]"+VVP2PProvider.class.getSimpleName();
	
	/** 私有全局变量：父类的Context实例引用 */
	private static Context parentContext = null;
	/** 私有全局变量：本类的单例句柄 */
	private static VVP2PProvider instance = null;
	
	/** 内部包装实现类之：P2P登陆操作包装实现类 */
	private LoginWrapper loginWrapper = null;
	
	/**
	 * 获得本类的唯一单例.
	 * <p>
	 * <b>说明：</b>本类会确保每次调用时parentContext的更新.
	 * 
	 * @param parentContext 父类的Context实例引用，本方法的每次调用将
	 * 会更新唯一实例中的parentContext为当前context句柄
	 * @return {@link VVP2PProvider}的唯一实例句柄
	 */
	public static VVP2PProvider getInstance(Context parentContext)
	{
		// 道理先设置context，否则后绪使用时初次VVP2PProvider.parentContext
		// 还没来的及被设置就调用之，从而出现context==null的异常情况发生
		VVP2PProvider.parentContext = parentContext;
		if(instance == null)
			instance = new VVP2PProvider();
		return instance;
	}
	
	/**
	 * 私有构造方法.
	 * <p>
	 * 获得本类对象的唯一方法是调用 {@link #getInstance(Context)}人而获得唯一实例.
	 * 
	 * @see #init()
	 */
	private VVP2PProvider()
	{
		init();
	}
	
	/**
	 * 核心初始化方法.
	 */
	public void init()
	{
		//** 2013-12-07日重要说明：initNet时的context一定要确保不能为null，
		//** 因不initNet方法中需要取本地ip（取本地ip时需要使用context实例）
		//** ，如果此时context为null则本地ip就无法取出，那么将导致的问题就是
		//** 跟好友连接后怎么也没有声音的问题（也就是20131207日前局域网非分非回路的问题产生的原因哦！）
		// 初始化网络状态
		P2PController.getInstance().initNet(parentContext);
		
		//** 2013-12-31日后【实时音频】“同意”指令的发出和接收方案2之【第0/2步：注册全局事件处理者】
		P2PController.getInstance().registryRequestEventListener(
				MyApplication.getInstance(parentContext).getIMClientManager().getTransDataListener());
		
		//------------------------------------------------
		if(loginWrapper == null)
			loginWrapper = new LoginWrapper();
	}
	
	/**
	 * 登陆P2P公开方法.
	 * <p>
	 * <b>注：</b>本方法不反对重复调用.
	 * 
	 * @param acount 用户登陆账号（目前对应于聊天框架中的UID）
	 * @see LoginWrapper#performLogin(String)
	 */
	public void login(String acount)
	{
		loginWrapper.performLogin(acount);
	}
	
//	/**
//	 * P2P打洞请求公开方法.
//	 * <p>
//	 * <b>注：</b>本方法不反对重复调用.
//	 * 
//	 * @param friendUid 用户登陆账号（目前对应于聊天框架中的UID）
//	 * @see P2PController#requestP2P(long)
//	 */
//	public void requestP2P(long friendUid)
//	{
//		// 发送打洞
//		P2PController.getInstance().requestP2P(friendUid);
//	}
	
	/**
	 * 释放资源.
	 * <p>
	 * 原则上讲，本方法是 {@link P2PController#initNet(Context)}的逆过程.
	 * 
	 * @see LoginWrapper#performLogout()
	 * @see P2PController#uinit()
	 */
	public void release()
	{
	    try{
            //** 2013-12-31日后【实时音频】“同意”指令的发出和接收方案2之【第0/2步：取消注册全局事件处理者】
            P2PController.getInstance().unRegistryRequestEventListener(
                    MyApplication.getInstance(parentContext).getIMClientManager().getTransDataListener());

            // 退出登陆
            loginWrapper.performLogout();
            P2PController.getInstance().uinit();

            // 重置此单例，方便在切换账号的情况下，下次能重新建新单例
            instance = null;
        }
        catch(Exception e)
        {
            Log.w(TAG, e);
        }
	}
	
	//
	public P2PController getP2PController()
	{
		return P2PController.getInstance();
	}
	//
	public VcController getVcController()
	{
		return VcController.getInstance();
	}
	
	//------------------------------------------------------------------------------------------------- inner classes
	private class LoginWrapper implements ILoginEventListener
	{
		public LoginWrapper()
		{
			P2PController.getInstance().setLoginEventListener(this);
		}
		
		public boolean performLogin(String acount)
		{
			boolean sendSucess = false;
			if(NetworkUtil.isNetSupport(parentContext))
			{
				if(acount == null)
				{
//                    Toast.makeText(this, "帐号输入不能为空", Toast.LENGTH_LONG).show();		
//                    sendSucess = false;
					Log.w(TAG, "帐号输入不能为空, acount==null!");
				}
				else
				{
					final long currAccount = Long.parseLong(acount);
					//登录
					int res = P2PController.getInstance().userLogin(currAccount, "key");
					if(res!=0)
					{
//                        Toast.makeText(this, "上报失败", Toast.LENGTH_LONG).show();
						Log.w(TAG, "登陆信息发送失败!");
                    }
					else
						sendSucess = true; 
				}
			}
			else
			{
//				Toast.makeText(this, "网络不可用", Toast.LENGTH_LONG);		
				Log.w(TAG, "网络不可用, 本次登陆失败!");
			}
			
			return sendSucess;
		}
		
		public void performLogout()
		{
			AccountManager.myAccount = 0;
			P2PController.getInstance().userLogOut(AccountManager.myAccount);
		}
		
		@Override
		public void onLoginSucc(long fromAccount, byte[] detail)
		{
			Log.i(TAG, "【VV1】上报服务器成功.");
			AccountManager.myAccount = fromAccount;
//		        Intent video_intent = new Intent(AccessActivity.this,MainActivity.class);
//		        startActivity(video_intent);
		}

		@Override
		public void onLoginFail(long fromAccount, byte[] detail)
		{
//			runOnUiThread(new Runnable(){
//	            @Override
//	            public void run() {
//	                Toast.makeText(AccessActivity.this,"上报服务器失败",Toast.LENGTH_LONG).show();
	            	Log.e(TAG, "【VV1】上报服务器失败!");
//	            }
//	        });
		}
	}
	
	//------------------------------------------------------------------------------------------------- utility methods
	/**
     * 实际接受请求函数
     * @param type 类型  1语音  2视频
     */
    public static void acceptRequest(Activity parentActivity, int type, long fromFriendUid, String nickName) 
    {
        Intent intent = new Intent(parentActivity, VideoActivityNew.class);//VideoChatActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
        intent.putExtra("toAccount", fromFriendUid);
        intent.putExtra("name", nickName);
        intent.putExtra("receive", true);
        intent.putExtra("type", type);
        parentActivity.startActivity(intent);
    }
    
    /**
	 * 启动通话模块，进行通话请求，请留意传递过去的参数
	 * @param type 类型  1视频  2语音
	 */
    public static void startAVChat(Activity parentActivity, int type, long friendUID, String friendNickName)
    {
    	int deviceSuportType = DeviceUtil.getDeviceVideoSupport();
        if (deviceSuportType == DeviceUtil.DEVICE_SUPPORT) 
        {
            if (NetworkUtil.isNetSupport(parentActivity))
            {
                Intent intent = new Intent(parentActivity, VideoActivityNew.class);//VideoChatActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra("toAccount", friendUID);
                intent.putExtra("name", friendNickName);
                intent.putExtra("receive", false);//false
                intent.putExtra("type", type);
                parentActivity.startActivity(intent);
            }
            else
            {
//                Toast.makeText(parentActivity,"网络错误",Toast.LENGTH_SHORT).show();
            	Log.w(TAG, "[V$V]网络错误");
            }
        }
        else if(deviceSuportType == DeviceUtil.SDK_NOT_SUPPORT) 
        {
//            Toast.makeText(parentActivity,"SDK版本不支持",Toast.LENGTH_SHORT).show();
        	Log.w(TAG, "[V$V]SDK版本不支持");
        }
        else if(deviceSuportType == DeviceUtil.DEVICE_NOT_SUPPORT)
        {
//            Toast.makeText(parentActivity,"您的设备不支持视频通话",Toast.LENGTH_SHORT).show();
        	Log.w(TAG, "[V$V]您的设备不支持视频通话");
        }
        else
        {
//            Toast.makeText(parentActivity,"您的手机不支持视频通话",Toast.LENGTH_SHORT).show();
        	Log.w(TAG, "[V$V]您的手机不支持视频通话");
        }
    }
}
